import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

/**
 * 对比两个国际化资源文件xml A和B，
 * 以A作为基准，对比B中是否存在一个string在A中有，而在B中没有，
 * 并将没有的string全部生成为C.xml，以便给第三方进行翻译
 * <p>
 * 注意：将没有翻译的C.xml文件拿给专业翻译人员翻译后，他们会返回翻译过后的文件给我们，然后将内容放到以前那个翻译文件，再用XmlSorter进行排序一次即可。
 * Created by heyiyong on 2016/5/7.
 */
public class XmlCompare {
    // 文件应放在src目录下
    public static final String latestFile = "xml/latestFile.xml"; // 最新的文件
    public static final String oldFile = "xml/oldFile.xml"; // 老的资源文件
    public static final String genFileName = "待翻译.txt";
    public Map<String, String> keyValMap = new TreeMap<>(); // 装载老文件的key和value
    public Map<String, String> treeMap = new TreeMap<>(); // 装载待生成文件的keyValueMap

    public void compare() throws DocumentException, IOException {
        // 1、找到文件源
        File baseFile = getFile();

        // 2、读取基础文件，加入到treeMap里
        Utils.readXmlWithChild(keyValMap, baseFile);

        // 3、读取第二个文件
        readXml2();

        // 4、写入文件
        write();
    }

    private File getFile() {
        URL baseSrc = XmlCompare.class.getResource(XmlCompare.oldFile);
        return new File(baseSrc.getFile());
    }

    private void write() throws IOException {
        Utils.writeXml(treeMap.entrySet(), new File(getFile().getParent(), genFileName));
    }

    private void readXml2() throws DocumentException {
        // 1、找到文件源
        File file = new File(XmlCompare.class.getResource(XmlCompare.latestFile).getFile());
        SAXReader reader = new SAXReader();
        Document document = reader.read(file);
        Element root = document.getRootElement();
        Iterator<Element> iterator = root.elementIterator();
        Set<String> keySet = keyValMap.keySet();
        while (iterator.hasNext()) {
            Element element = iterator.next();
            String name = element.attribute("name").getValue();
            if (!keySet.contains(name)) {
                String value = element.getStringValue();
                treeMap.put(name, value);
            }
        }
        System.out.println("treeMap = " + treeMap);
    }

    public static void main(String[] args) throws Exception {
        new XmlCompare().compare();
    }
}
